home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / docs / asm_guide / assembler course / 3.s < prev    next >
Text File  |  1992-04-27  |  2KB  |  68 lines

  1. ; this source will take numbers from a row, subtract #$10 from them,
  2. ; and put them in another row. Note that you must reserve a room in
  3. ; memory to put the new values in. This is done with BLK.x:
  4. ;   BLK.B 10,0   reserves a room of 10 bytes in memory and fills
  5. ;         them with 0's
  6.  
  7.  
  8.  
  9. top:    movem.l    d0-d7/a0-a6,-(a7)    ; save registers
  10.  
  11.     lea.l    row1,a0        ; put the address of 'row1' in a0
  12.                 ; same as: MOVE.L #row1,a0
  13.     lea.l    row2,a1        ; idem... row2 is the empty row
  14.  
  15. loop:    cmp.l    #endrow1,a0    ; check if we reached the end...
  16.                 ; note that we compare addresses,
  17.                 ; so we must compare all 32 bits
  18.                 ; (=longword : CMP.L)
  19.     beq.s    endloop        ; if so, branch (short) to 'end'
  20.  
  21.     move.b    (a0)+,d0    ; move contents of (a0) to d0 and
  22.                 ; increase a0
  23.     sub.b    #$10,d0        ; subtract hexadecimal value #$10
  24.                 ; from d0
  25.     move.b    d0,(a1)+    ; move contents of d0 to the other
  26.                 ; row and increase a1
  27.     bra.s    loop        ; do it again !! (branch short)
  28.  
  29. endloop:
  30.  
  31.     movem.l    (a7)+,d0-d7/a0-a6    ; don't forget to reload
  32.                     ; the registers after you
  33.     rts      ; return !        ; saved them. In fact you 
  34.                     ; should save registers at
  35.                     ; the start of each source,
  36.                     ; but if you didn't, you can
  37.                     ; ofcourse not reload them !
  38.  
  39. ; after you've assembled the source, have a look at the 2 rows: type
  40. ; '@hrow1' and '@hrow2': you'll see row1 filled with the values in the
  41. ; next list:
  42.  
  43. row1:    dc.b    $20,$40,$5a,$a4,$ff,$03,$10,$40
  44.     dc.b    $64,$29,$65,$77,$b0,$ac,$00,$e2
  45. endrow1:
  46.  
  47. ; before executing, row2 will still be filled with zeros, but after
  48. ; executing, row2 will contain the values from row1, minus #$10
  49.  
  50. length=    endrow1-row1
  51.  
  52. row2:    blk.b    length,0
  53.  
  54. ; in these last lines you see a very powerful feature of Asmone. You
  55. ; can do calculations. Here we calculated the size of the
  56. ; first row. Row1 starts at label 'row1' and ends at label 'endrow1'
  57. ; By subtracting addres 'row1' (let's say it is $10000) from 
  58. ; 'endrow1' (let's say $10010), we get the length of the row (#$10)
  59. ; This value is automatically calculated by Seka when you assemble
  60. ; the source. The line 'length= endrow1-row1'  is NOT an assembler-
  61. ; command, this line is not included in the assembled program.
  62.  
  63. ; note: this documentation could be very nice, but it could also
  64. ;    make the program look unoverviewable, so maybe you should
  65. ;    remove all the info-lines from it, and again have a look.
  66. ;    This could make it all a bit more understandable !
  67.  
  68.